#pragma once

#include <memory>
#include <vector>
#include "eigen/hidden_layer.h"
#include "eigen/loss.h"

namespace  ldl_eigen
{
class Net
{
public:
    virtual ~Net() = default;
    void add_hidden_layer(std::shared_ptr<HiddenLayer> layer);
    void set_loss(std::shared_ptr<Loss> loss);
    float train(const Eigen::MatrixXf &features, const Eigen::MatrixXf &labels);
    Eigen::MatrixXf predict(const Eigen::MatrixXf &features);
private:
    std::vector<std::shared_ptr<HiddenLayer>> hidden_layers_{}; 
    std::shared_ptr<Loss> loss_{};
};
}
